package com.union.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;

public class MathUtils
{
	private static final int DEF_DIV_SCALE=10;
	private MathUtils()
	{
	}

	/**
	 * 浮点数A大于B
	 */
	public static boolean moreThan(double a, double b)
	{
		return new BigDecimal(a).compareTo(new BigDecimal(b)) == 1 ? true : false;
	}

	/**
	 * 浮点数A等于B
	 */
	public static boolean equals(double a, double b)
	{
		return new BigDecimal(a).compareTo(new BigDecimal(b)) == 0 ? true : false;
	}

	/**
	 * 浮点数A小于B
	 */
	public static boolean lessThan(double a, double b)
	{
		return new BigDecimal(a).compareTo(new BigDecimal(b)) == -1 ? true : false;
	}

	/**
	 * 浮点数加法保留两位小数
	 */
	public static double add(double a, double b)
	{
		BigDecimal b1 = new BigDecimal(a);
		BigDecimal b2 = new BigDecimal(b);
		return saveTwoDecimal(b1.add(b2).doubleValue());
	}

	/**
	 * 浮点数减法保留两位小数
	 */
	public static double sub(double a, double b)
	{
		BigDecimal b1 = new BigDecimal(a);
		BigDecimal b2 = new BigDecimal(b);
		return saveTwoDecimal(b1.subtract(b2).doubleValue());
	}

	/**
	 * 浮点数乘法保留两位小数
	 */
	public static double mul(double a, double b)
	{
		BigDecimal b1 = new BigDecimal(Double.toString(a));
		BigDecimal b2 = new BigDecimal(Double.toString(b));

		return saveTwoDecimal(b1.multiply(b2).doubleValue());
	}

	/**
	 * 浮点数除法保留两位小数
	 */
	public static double div(double a, double b)
	{
//		BigDecimal b1 = new BigDecimal(a);
//		BigDecimal b2 = new BigDecimal(b);
		return div(a,b,DEF_DIV_SCALE);

//		return saveTwoDecimal(b1.divide(b2,0).doubleValue());
	}

	public static double saveTwoDecimal(double totalPrice)
	{
		BigDecimal bigDecimal = new BigDecimal(totalPrice);
		return bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	public static String saveTwoDecimal2(double totalPrice)
	{
		DecimalFormat fnum = new DecimalFormat("##0.00");
		return fnum.format(totalPrice);
	}


	public static double div(double d1,double d2,int scale){
		if(scale<0){
			throw new IllegalArgumentException("The scale must be a positive integer or zero");
		}
		BigDecimal b1=new BigDecimal(Double.toString(d1));
		BigDecimal b2=new BigDecimal(Double.toString(d2));
		return b1.divide(b2,scale, BigDecimal.ROUND_HALF_UP).doubleValue();

	}

	/**
	 * NumberFormat is the abstract base class for all number formats.
	 * This class provides the interface for formatting and parsing numbers.
	 * @param d
	 * @return
	 */
	public static String formatDouble3(double d) {
		NumberFormat nf = NumberFormat.getNumberInstance();
		// 保留两位小数
		nf.setMaximumFractionDigits(2);
		// 如果不需要四舍五入，可以使用RoundingMode.DOWN
		nf.setRoundingMode(RoundingMode.UP);
		return nf.format(d);
	}

	/**
	 * 这个方法挺简单的。
	 * DecimalFormat is a concrete subclass of NumberFormat that formats decimal numbers.
	 * @param d
	 * @return
	 */
	public static String formatDouble4(double d) {
		DecimalFormat df = new DecimalFormat("#.00");
		return df.format(d);
	}

	/**
	 * 如果只是用于程序中的格式化数值然后输出，那么这个方法还是挺方便的。
	 * 应该是这样使用：System.out.println(String.format("%.2f", d));
	 * @param d
	 * @return
	 */
	public static String formatDouble5(double d) {
		return String.format("%.2f", d);
	}



}
